「さて、ここからは技術のターンだ」
「淡々と進めてくれ」
TypeScriptで敗北 §
「カンスト・キングというアイデアが最初に産まれた時、TypeScriptで書かれたSPAとして作成しようと思って実際に5割ぐらい書いた」
「それで?」
「実際に分かったことは以下の3点だ」
- TypeScript開発は実は効率が良くない
- TypeScriptの型表現力は実はあまり高くない。C#で当たり前に書ける型が書けないケースがある
- 仕様に冗長性がある
「ふむふむ。TypeScript開発は実は効率が良くないって何?」
「JavaScriptより圧倒的に効率は良いのだが、C#で書いていたようなコードを書こうとすると、効率はあまり高くないことを実感した。一度トラブルが起きると半日1日ぐらい掛かってしまうこともあるが、C#だとせいぜい1時間が2時間で突破して先に行ける。非常に大ざっぱな体感だけどね」
「じゃあ、TypeScriptの型表現力は実はあまり高くないって?」
「ゲームに登場するキャラクターやモンスターの型を定義しようとしたとき、必要な情報が書けなかった。だから少し甘い型定義になっていた」
「甘い型定義になると何が問題なの?」
「コンパイラの型チェックが不徹底になる」
「じゃあ、仕様に冗長性があるってなに?」
「それはアプリ側の問題。書いていると【実はなくても良かった機能】に気付かされる」
「たとえば何が不要だったの?」
「ショップ、ゲーム内通貨とかダンジョンだね。あれは無くても良かった。だからBlazor版には含まれていない」
Blazor登場 §
「じゃあ、問題点が3つ分かって君はどうしたの?」
「その時、丁度Blazorにはまったところ」
「それで?」
「これならC#で書き直した方が早い!と思ったね」
「実際に速かったと思う?」
「5割書いたソースを捨ててしまうので、現実的な期間の問題は微妙だが、開発効率がグッと上がったことは事実だ」
「ソースは変換しなかったの?」
「最初は機械的に書き換えようかと思ったが結局全部新規で書いたようなものだ。実は構造がまるで違うので機械的に置き換えても良いソースにならない」
「使ったのはBlazorだけ?」
「nugetでBlazorのstorageライブラリも使った。カンストキングのセーブ時の保存先はWebブラウザのローカルストレージだ。クラウドは単に実行ファイルを配布する機能しか持っていない」
「なぜそんな形式にしたの?」
「利用者が増えてもページの初期ロード以外では重さを感じないで済む」
「実際にBlazorでの開発はどうだった?」
「Blazor自身が実験的なプロジェクトだから細かい制限事項やトラブルは多かったよ」
「たとえば?」
「Dictionary<string,string>以外のDictionaryクラスはストレージに保存できない制限がある。レポートしたけどトリアージされたのでしばらくは続く制限事項だろう」
「それで?」
「でも、それを含めてもTypeScriptでの開発より効率が良かった。本当にサクサクと作業が進んだ」
総合評価 §
「ふむふむ。それは君としてはBlazorをどう評価する?」
「No More JavaScript。No More TypeScript。Blazor一択。次もBlazor開発で頼む」
「JavaScript<<TypeScript<<Blazorということだね」
「この先、JavaScriptでWebの世界を乗り切れると思っている人は多いようだが、それはたぶん無理。あれよりマシな言語は山ほどあって、それらがすべてWebAssembly経由でWebブラウザに殺到する。C#より優れた言語もみんな来る。JavaScriptがいかに大勢力であろうと、その他言語連合のオールスターズを前にしては負けるだろう。JavaScriptプログラマーは認めないだろうけどね」
「それで、君はBlazorなのかい?」
「当面はBlazorだな。Blazorだけが今のところ未来への道だ」
「なぜ他の言語を使おうとしないの? 他の言語も動くのだろう?」
「なぜならC#の資産があるからさ」
「それだけ?」
「それに、ろくに評価もしていない別言語への移行はリスキーだしな」
「じゃあ次もBlazor?」
「当然だ」
「C#で他のタイプのソフトは書かないの?」
「目的に応じて書くかもしれないが、メインはBlazorになりそうな気がする」